'''
用栈实现队列：
使用2个队列，in用于追加数据。out用于取出数据，先把in都弹出到out，再pop或者get。
由于in的顺序为1，2，3。
out的顺序为也应该是1，2，3。那么先pop就是3，2，1.再append到out就是3，2，1。
此时pop out，就是1，2，3。于是实现了队列。
'''

class MyQueue:
    def __init__(self):
        self.stack_in = []
        self.stack_out = []
    # 往in追加数据
    def push(self, x: int) -> None:
        self.stack_in.append(x)

    def pop(self) -> int:
        # 先从in弹出到out中，再把out末尾弹出
        if not self.stack_out:
            while self.stack_in:
                self.stack_out.append(self.stack_in.pop())
        return self.stack_out.pop()

    def peek(self) -> int:
        # 先从in弹出到out中，再返回out末尾
        if not self.stack_out:
            while self.stack_in:
                self.stack_out.append(self.stack_in.pop())
        return self.stack_out[-1]

    # in和out都为空则表示空
    def empty(self) -> bool:
        return not self.stack_in and not self.stack_out

# 测试用例
def test_MyQueue():
    myQueue = MyQueue()
    myQueue.push(1)  # queue is: [1]
    myQueue.push(2)  # queue is: [1, 2] (leftmost is front of the queue)
    print(f"Peek: {myQueue.peek()}")  # 预期输出: 1
    print(f"Pop: {myQueue.pop()}")  # 预期输出: 1, queue is [2]
    print(f"Is empty: {myQueue.empty()}")  # 预期输出: False
    myQueue.push(3)  # queue is: [2, 3]
    print(f"Peek: {myQueue.peek()}")  # 预期输出: 2
    print(f"Pop: {myQueue.pop()}")  # 预期输出: 2, queue is [3]
    print(f"Pop: {myQueue.pop()}")  # 预期输出: 3, queue is []
    print(f"Is empty: {myQueue.empty()}")  # 预期输出: True

# 运行测试用例
test_MyQueue()

